Red Hat System Administration II 8.2

Присоединение постоянного хранилища к контейнеру

Задачи

После завершения этого раздела вы сможете предоставить постоянное хранилище для данных контейнера путем монтирования каталога с хоста контейнеров внутри работающего контейнера.

Подготовка постоянного хранилища

Хранилище в контейнере является временным, то есть его содержимое теряется после удаления контейнера.

Если при перезапуске контейнера необходимо сохранять используемые им данные, временного хранилища недостаточно. Представьте, что у вас есть контейнер, являющийся сервером базы данных, и эта база данных должна сохраняться при перезапуске контейнера. Чтобы контейнеризованные приложения могли соблюдать это требование, необходимо предоставить контейнеру постоянное хранилище.

Предоставление постоянного хранилища с хоста контейнеров

Один из простых способов предоставить контейнеру постоянное хранилище — использовать каталог на хосте контейнеров для хранения данных. Утилита Podman может смонтировать каталог хоста внутри работающего контейнера. Контейнеризованное приложение видит эти каталоги хоста как часть хранилища контейнера. Во многом это похоже на то, как обычные приложения видят удаленный сетевой том как часть файловой системы хоста. Когда вы удаляете контейнер, система не удаляет содержимое каталога хоста контейнеров. Новый контейнер может монтировать этот каталог для доступа к данным.

Например, контейнер базы данных может использовать каталог хоста для хранения файлов базы данных. Если этот контейнер перестанет работать, вы можете создать новый контейнер, использующий тот же каталог хоста, чтобы данные базы данных оставались доступными для клиентских приложений. Для контейнера базы данных не имеет значения, где находится этот каталог хоста. Он может быть где угодно, например в разделе локального жесткого диска или в удаленной сетевой файловой системе.

Подготовка каталога хоста

Подготавливаемый каталог хоста необходимо настроить таким образом, чтобы процессы внутри контейнера могли обращаться к нему. Настройка каталога предполагает выполнение следующих действий:

  • настройка владельца и разрешений для каталога;

  • указание соответствующего контекста SELinux.

У учетной записи пользователя, которую использует приложение внутри контейнера, должен быть доступ к каталогу хоста. Обязательно задайте нужные разрешения для каталога хоста, чтобы приложение могло к нему обращаться.

Кроме того, необходимо настроить для каталога хоста соответствующий контекст SELinux ― container_file_t. Podman использует контекст SELinux container_file_t, чтобы указать, к каким файлам в системе хоста контейнеру разрешен доступ. Если на уровне контейнеризации есть проблема в системе безопасности, эта дополнительная защита не позволит приложению, работающему внутри контейнера, получить доступ к файлам хоста вне общего каталога. Такая защита особенно важна для приложений, работающих от имени пользователя root внутри контейнера с правами root.

Без этой дополнительной защиты SELinux приложения получат root-доступ ко всем файлам в системе хоста и смогут нарушить безопасность хоста и других контейнеров. Podman может задать контекст SELinux для каталога хоста при запуске контейнера.

Монтирование тома

После создания и настройки каталога хоста следующим шагом будет монтирование этого каталога в контейнер. Чтобы смонтировать каталог хоста в контейнер, добавьте опцию --volume (или -v) в команду podman run, указав путь к каталогу хоста и путь к хранилищу контейнера, разделив их двоеточием.

--volume host_dir:container_dir:Z

При использовании опции Z утилита Podman автоматически применяет контекст SELinux container_file_t к каталогу хоста.

Например, чтобы использовать каталог хоста /home/user/dbfiles для файлов базы данных MariaDB как /var/lib/mysql внутри контейнера, используйте приведенную ниже команду. Следующая команда podman run очень длинная, и ее необходимо вводить в одной строке:

[user@host ~]$ podman run -d --name mydb -v /home/user/dbfiles:/var/lib/mysql:Z -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=inventory registry.redhat.io/rhel8/mariadb-103:1-102